; void ecosimple(wav_file* origen, wav_file* destino);

%define origen ebp + 8
%define destino ebp + 12

global ecosimple

section .text

ecosimple:
	push ebp
	mov ebp, esp
	push esi
	push edi
	push ebx
	
	mov esi, [origen] ; Muevo a esi el puntero al wav_file.
	mov esi, [esi + 16] ; Muevo a esi el puntero al format_chunk.
	mov ecx, [esi + 4] ; Muevo a ecx el chunk_size.
	mov esi, [esi + 8] ; Muevo a esi el puntero a data.
	
	mov edi, [destino]
	mov edi, [edi + 16]
	mov edi, [edi + 8]
	
	sub ecx, 32
	shr ecx, 3
	
	pxor xmm7, xmm7
	
ciclo:
	movq xmm0, [esi]
	movq xmm1, [esi + 8]
	movq xmm2, [esi + 16]
	movq xmm3, [esi + 24]
	movq xmm4, [esi + 32]
	
	punpcklbw xmm0, xmm7
	punpcklbw xmm1, xmm7
	punpcklbw xmm2, xmm7
	punpcklbw xmm3, xmm7
	punpcklbw xmm4, xmm7
	
	psrlw xmm1, 1
	psrlw xmm2, 2
	psrlw xmm3, 3
	
	paddusw xmm0, xmm1
	paddusw xmm0, xmm2
	paddusw xmm0, xmm3
	paddusw xmm0, xmm4
	
	packuswb xmm0, xmm7
	
	movq [edi], xmm0
	
	add edi, 8
	add esi, 8
	
	loop ciclo
	
fin:	
	pop ebx
	pop edi
	pop esi
	pop ebp
	ret
